package day03.io;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

//提高每次读写的数据量，减少读写的次数，可以提高读写效率
//单字节读写是一种随机读写形式
//一组字节的读写是块读写形式
//对于机械硬盘和其他硬盘而言，块读写的效率很好，但是随机读写性能差
public class CopyDemo2 {
    public static void main(String[] args) throws IOException {
        FileInputStream fis=new FileInputStream("imh.jpeg");
        FileOutputStream fos=new FileOutputStream("img_cp2.jpeg");
        /*
        * 流提供了块读写操作
        * InputStream定义的块读操作
        * int read(byte[] data)
        * 一次性读取给定字节数组总长度的字节量并存入到该数组中，返回值表示实际读取
        * 到的字节数，若返回值为-1则表示本次没有读取到任何数据，且已经是文件末尾了
        * 文件数据：
        * 11000011 11110000  10101010 01010101  11001100  00001111
        * byte[] data=new byte[4];//4字节的数组
        * int len;
        * len =fis.read(data)
        * 从文件中一次性读取4个字节并存入data数组，返回的len表示实际读取到了几个字节
        * data:{11000011 11110000  10101010 01010101}
        * len=4
        * 第二次调用
        * 文件数据：
        * 11000011 11110000  10101010 01010101  11001100  00001111
        *                                       ^^^^^^^^^^^^^^^^^^
        *                                       文件只剩两个字节可以读取
        * len =fis.read(data)
        * data:{11000011 11110000  10101010 01010101}
        * |本次读取到的2字节|   |上次遗留无用数据|
        * len=2;
        * 第三次读取：
        * 11000011 11110000  10101010 01010101  11001100  00001111 文件末尾
        * len =fis.read(data);
        * data:{11000011 11110000  10101010 01010101}
        * |都是无用数据  |
        *len=-1;
        *
        *
        *
        * 块写操作
        * void write(byte[] data)
        * 将给定的字节数组中的所有字节一次性写出
        * void write(byte[] data,int offset,int len)
        * 将给定的字节数组从下标offset处开始的连续len个字节一次性写出
        * 00000000        1bytue  字节
        * 1024bytue       1mb
        */
//        int t=60*60*24*1000;
        byte[] data=new byte[1024*10];//10kb
        int len;//记录每次实际读取到的字节数
        long start=System.currentTimeMillis();
        while ((len=fis.read(data))!=-1){
            fos.write(data,0,len);
        }
        long end=System.currentTimeMillis();
        System.out.println("耗时"+(end-start));
        fis.close();
        fos.close();
    }
}
